package Tela;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.swing.JPanel;
import javax.swing.JTable;

import BancoDados.AcessaDB;

public class PanelGrafo extends JPanel implements MouseListener,
		MouseMotionListener {

	private Image imagem = null;
	private Graphics grafico = null;
	private ArrayList items;
	private ArrayList selecionados;
	private AcaoPanelGrafo acaoAtual;
	private int posXAtual = -1;
	private int posYAtual = -1;

	private JTable tabela;
	private AcessaDB objConexao;

	public AcessaDB getObjConexao() {
		return objConexao;
	}

	public void setObjConexao(AcessaDB objConexao) {
		this.objConexao = objConexao;
	}

	public JTable getTabela() {
		return tabela;
	}

	public void setTabela(JTable tabela) {
		this.tabela = tabela;
	}

	public PanelGrafo(AcaoPanelGrafo acaoPadrao) {

		items = new ArrayList();
		selecionados = new ArrayList();
		acaoAtual = acaoPadrao;

		addMouseListener(this);
		addMouseMotionListener(this);
	}

	public void paint(Graphics g) {

		Dimension d = getSize();
		if (imagem == null) {

			imagem = createImage(d.width, d.height);
			grafico = imagem.getGraphics();
		}

		grafico.setColor(Color.green);
		grafico.fillRect(0, 0, d.width, d.height);

		for (int i = 0; i < items.size(); i++) {
			ItemPanelGrafo item = (ItemPanelGrafo) items.get(i);
			item.desenhar(grafico, posXAtual, posYAtual, selecionados
					.indexOf(item) >= 0);
		}

		g.drawImage(imagem, 0, 0, null);
	}

	public int qtosItems() {
		return items.size();
	}

	public int qtosItemsSelecionados() {
		return selecionados.size();
	}

	public ItemPanelGrafo getItem(int i) {
		return (ItemPanelGrafo) items.get(i);
	}

	public ItemPanelGrafo getItemSelecionado(int i) {
		return (ItemPanelGrafo) selecionados.get(i);
	}

	public void setAcao(AcaoPanelGrafo novaAcao) {
		acaoAtual.mudouAcao();
		acaoAtual = novaAcao;
	}

	public void addItem(ItemPanelGrafo item) {
		items.add(item);
	}

	public void removerItem(ItemPanelGrafo item) {
		items.remove(item);
	}

	public void removerSelecionados() {
		selecionados.clear();
	}

	public void addSelecionado(ItemPanelGrafo item) {
		selecionados.add(item);
	}

	public void removeSelecionado(ItemPanelGrafo item) {
		selecionados.remove(item);
	}

	public ArrayList getSelecionados() {
		return selecionados;
	}

	private void setPosicaoAtual(int x, int y) {
		posXAtual = x;
		posYAtual = y;
	}

	// eventos do mouse

	// quando o mouse eh pressionado
	public void mousePressed(MouseEvent event) {

		setPosicaoAtual(event.getX(), event.getY());
		String retornoSql = acaoAtual.executar(posXAtual, posYAtual);
		// Rodrigo
		if ((retornoSql != null) && (!retornoSql.equalsIgnoreCase(""))) {

			try {
				tabela.setModel(new ResultSetTableModel(objConexao
						.executaSql(retornoSql)));
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
		// Rodrigo
		repaint();

	}

	// o mouse eh liberado apos ser arrastado
	public void mouseReleased(MouseEvent event) {

		setPosicaoAtual(event.getX(), event.getY());
		acaoAtual.encerrar(posXAtual, posYAtual);
		repaint();

	}

	// arrasta o mouse com o botao pressionado
	public void mouseDragged(MouseEvent event) {

		setPosicaoAtual(event.getX(), event.getY());
		acaoAtual.mover(posXAtual, posYAtual);
		repaint();

	}

	// quando o mouse eh movimentado
	public void mouseMoved(MouseEvent event) {
		setPosicaoAtual(event.getX(), event.getY());
		repaint();
	}

	// quando o mouse eh pressionado e logo liberado
	public void mouseClicked(MouseEvent event) {
	}

	public void mouseEntered(MouseEvent event) {
	}

	public void mouseExited(MouseEvent event) {
	}

	public ArrayList getItens() {
		return this.items;
	}

}
